/*
 * @Description:
 * @Autor: 人生
 * @Date: 2020-09-29 10:02:28
 * @,@LastEditors: ,: 人生
 */
import T from 'ant-design-vue/es/table/Table';

export default {
  data() {
    return {
      localLoading: false,
      localDataSource: [], // 表格数据
      localPagination: [], // 表格分页数据
    };
  },
  props: {
    ...T.props,
    data: {
      type: Function,
      required: true,
    },
    showPagination: { // 是否显示分页
      type: Boolean,
      default: false,
    },
    showSizeChanger: { // 是否可以改变每页条数
      type: Boolean,
      default: true,
    },
    pageNum: { // 当前页码
      type: Number,
      default: 1,
    },
    pageSize: { // 每页条数
      type: Number,
      default: 10,
    },
    rowSelection: { // 复选框
      type: Object,
      default: null,
    },
  },
  created() {
    // 初始化分页数据
    this.localPagination = this.showPagination && ({
      ...this.localPagination,
      current: this.pageNum,
      pageSize: this.pageSize,
      showSizeChanger: this.showSizeChanger,
    }) || false;
    // 获取列表数据
    this.loadData();
  },
  methods: {
    refresh(bool = false) {
      bool && (this.localPagination = { current: 1, pageSize: this.pageSize });
      this.loadData();
    },
    loadData(pagination, filters, sorter) {
      // 请求前先加载loading
      this.localLoading = true;
      // 如果分页显示，并且是分页跳转，合并跳转的分页页数，每页条数
      // 如果有排序/过滤，按照antd文档合并参数
      const parameter = {
        curPage: (pagination && pagination.current)
          || this.showPagination && this.localPagination.current || this.pageNum,
        pageSize: (pagination && pagination.pageSize)
          || this.showPagination && this.localPagination.pageSize || this.pageSize,
        ...(sorter && sorter.field && {
          sortField: sorter.field,
        }) || {},
        ...(sorter && sorter.order && {
          sortOrder: sorter.order,
        }) || {},
        ...filters,
      };
      // 发起请求，获取返回内容
      const result = this.data(parameter);
      // 简单判断下返回是否是promise
      if ((typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function') {
        result.then((r) => {
          // if(!r.data || !r.pageNo || !r.totalCount){
          if (!r.data || (!r.totalCount && r.totalCount !== 0)) {
            this.localLoading = false;
            throw new Error('返回数据格式不匹配');
          }
          // 分页数据进行合并
          this.localPagination = this.showPagination && ({
            ...this.localPagination,
            current: r.pageNo, // 返回结果中的当前分页数
            total: r.totalCount, // 返回结果中的总记录数
            showSizeChanger: this.showSizeChanger,
            pageSize: (pagination && pagination.pageSize)
              || this.localPagination.pageSize,
          }) || false;
          // 为防止删除数据后导致页面当前页面数据长度为 0 ,自动翻页到上一页
          // 如果当前页的数据数量为0，并且有分页，并且分页页码大于1，翻到上一页在请求数据
          if (r.data.length === 0 && this.showPagination && this.localPagination.current > 1) {
            this.localPagination.current--;
            this.loadData();
            return;
          }
          //= ========注意：需要测试改变pagesize后只有一页数据是否会出现隐藏分页的情况 ===========
          // 这里用于判断接口是否有返回 r.totalCount 且 this.showPagination = true 且 pageNo
          // 和 pageSize 存在 且 totalCount 小于等于 pageNo * pageSize 的大小
          // 当情况满足时，表示数据不满足分页大小，关闭 table 分页功能
          try {
            if ((this.showPagination && r.totalCount <= (r.pageNo * this.localPagination.pageSize))) {
              this.localPagination.hideOnSinglePage = true; // 只有一页时是否隐藏分页器
            }
          } catch (e) {
            this.localPagination = false;
          }

          this.localDataSource = r.data.map((t, i) => {
            t.sort = (this.pageSize * (r.pageNo - 1)) + (i + 1);
            return t;
          }); // 返回结果中的数组数据
          this.localLoading = false;
        });
      }
    },
  },

  render() {
    const props = {};
    const localKeys = Object.keys(this.$data);
    Object.keys(T.props).forEach((k) => {
      const localKey = `local${k.substring(0, 1).toUpperCase()}${k.substring(1)}`;
      if (localKeys.includes(localKey)) { // 将data中的表格数据赋值到props中
        props[k] = this[localKey];
        return props[k];
      }
      if (k === 'rowSelection') {
        if (!this.rowSelection) {
          // 如果没打算开启 rowSelection 则清空默认的选择项
          props[k] = null;
          return props[k];
        }
      }
      this[k] && (props[k] = this[k]);
      return props[k];
    });
    return <a-table {...{ props, scopedSlots: { ...this.$scopedSlots } }} onChange={this.loadData} onExpand={ (expanded, record) => { this.$emit('expand', expanded, record); } }>
      {Object.keys(this.$slots).map((name) => (<template slot={name}>{this.$slots[name]}</template>))}
    </a-table>;
  },
};
